<?php
class RoleModel extends Model{
    protected $fields=array(
        'id','name', 'status', 'remark',
        '_pk'=>'id',
        '_autoInc'=>true
    );

    protected $_auto=array(
        array('name','trim','ALL','function')
    );

    //TODO 增加修改时ID主键的验证
    protected $_validate=array(
        array('name','require','角色名称必须填写')
    );

    /**
     * 添加角色
     * 成功返回角色信息，失败返回false
     */
    public function addRole(){
        $roleVo=$this->create();
        if(!$roleVo){
            return false;
        }
        //验证角色名称是否已经使用
        if($this->checkRoleNameUsed($roleVo['name'])){
            $this->error='角色名称<b>'.$roleVo['name'].'</b>已经被使用';
            return false;
        }
        $this->startTrans();
        $ret=$this->add($roleVo);       //成功则返回主键
        if($ret){
            $continue=true;
            //获取权限信息
            if(array_key_exists('popedom',$_POST)){
                $node=new NodeModel();
                $nodeList=$node->field('id,pid,level')->where('menu in (0,'.implode(',', $_POST['popedom']).')')->findAll();
                $access=array();
                foreach($nodeList as $n){
                    $access[]=array(
                        'role'=>$ret,
                        'nodeId'=>$n['id'],
                        'level'=>$n['level'],
                        'parentNodeId'=>$n['pid']
                    );
                }
                if(count($access)>0){
                    $accessDao=new AccessModel();
                    if(false===$accessDao->addAll($access)){
                        $continue=false;
                    }
                }
                if($continue){
                    $this->commit();
                    return $roleVo;
                }
            }
        }
        $this->rollback();
        $this->error=SAVE_FAIL;
        return false;
    }

    public function updateRole(){
        $vo=$this->create();
        //验证要修改的角色是否存在
        $existRole=$this->where('id='.$vo['id'])->find();
        if( ! $existRole  ){
            $this->error='传入参数丢失';
            return false;
        }
        //判断新的角色名是否被占用
        if( $vo['name']!=$existRole['name'] && $this->checkRoleNameUsed($vo['name'], $vo['id'])  ){
            $this->error='角色名称<b>'.$vo['name'].'</b>已经被使用';
            return false;
        }
        $this->startTrans();
        //更新角色信息
        if($this->save($vo, 'id='.$vo['id'])){
            $continue=true;
            //取权限信息进行更新
            if(array_key_exists('popedom',$_POST)){
                $node=new NodeModel();
                $nodeList=$node->field('id,pid,level')->where('menu in (0,'.implode(',', $_POST['popedom']).')')->findAll();
                $access=array();
                foreach($nodeList as $n){
                    $access[]=array(
                        'role'=>$vo['id'],
                        'nodeId'=>$n['id'],
                        'level'=>$n['level'],
                        'parentNodeId'=>$n['pid']
                    );
                }
                if(count($access)>0){
                    $accessDao=new AccessModel();
                    //删除旧有的信息并添加新的信息
                    if( ! $accessDao->deleteAll('role='.$vo['id']) ){
                        $continue=false;
                    }
                    if( $continue && ! $accessDao->addAll($access)){
                        $continue=false;
                    }
                }
            }
            if($continue){
                $this->commit();
                return $vo;
            }
        }
        $this->rollback();
        $this->error=UPDATE_FAIL;
        return false;
    }

    public function removalRole(){
        
    }

    /**
     * 检查角色名称是否已经被使用
     * @param <type> $roleName  角色名称
     * @return <boolean>  true 已经被使用 false未被使用
     */
    public function checkRoleNameUsed($roleName,$originID=0){
        $tmp=$this->where("name='{$roleName}' && id<>".$originID)->find();
        if($tmp) return true;
        return false;
    }

}
